#include <cstdlib>
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include "server_thread_enviar.h"
#include "server_socket.h"
#define PORT 4321
#define LARGO 5

using std::cout;
using std::endl;
using std::string;
using std::vector;

Server_thread_enviar::Server_thread_enviar(Server_socket* s, Server_socket* nuevo) {
    socket = s;
    nuevo_socket = nuevo;
}

Server_thread_enviar::~Server_thread_enviar() {
}

/* Ejecutar: funcion donde hay un bucle para enviar informacion del cliente. */
void Server_thread_enviar::ejecutar() {
    bool inicial = true;
    string aux;
    while ((*correServer) && (*correCliente) && (*agregadoAPartida)) {
        std::this_thread::sleep_for(std::chrono::milliseconds((400)));
        //enviar tilemap        
        if (inicial == true) {
            aux = agregarLargo(this->partida->getTileMapInicial());
            inicial = false;
        } else {
            if (*correCliente) {
                aux = agregarLargo(this->partida->getTileMap());
            }
        }
        if (*correCliente) {
            int aux_tam = aux.size();
            if (socket->enviar(nuevo_socket->get_fd(), aux, aux_tam) == -1) {
                cout << "server_thread_cliente enviar" << endl;
            }
        }
    }
}

void Server_thread_enviar::setFlagsCorrer(bool* fServer, bool* fCliente, bool* fPartida) {
    correServer = fServer;
    correCliente = fCliente;
    agregadoAPartida = fPartida;
}

void Server_thread_enviar::setTiempoActualizacion(int tiempo) {
    tiempoActualizacion = tiempo;
}

string Server_thread_enviar::agregarLargo(string buffer) {
    int largo = buffer.size() + 1;
    char* formato = (char*) malloc((LARGO + 1) * sizeof (char));
    snprintf(formato, LARGO + 1, "%.5d", largo);
    string aux;
    aux.append(string(formato));
    aux.append("|");
    aux.append(buffer);
    free(formato);
    return aux;
}

void Server_thread_enviar::setPartida(Partida* partida) {
    this->partida = partida;
}